"""
高阶函数-高阶函数的意思是当接收函数是一个参数，或者返回值是一个函数的时候。这类的函数就是高阶函数
java8里面高阶函数据很多。lambda表达式，stream都是高阶函数
函数时编程再js重用的多，很多组件编程直接返回js，页面就能解析
"""
"""
python中，函数是一等对象
    特点:1.运行时创建的，表示编译时创建的
        2.能赋值给变量
        3.能作为参数传递
        4.能作为返回值返回
"""
"""
定义一个函数 实现列表筛选功能
    注意函数条件不确定，但是一旦满足条件就能添加元素到集合重是先筛选,类似java的filter方法
"""
# 将其中的偶数作为一个列表返回
arr_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

"""
定义一个集合和函数，函数的返回值默认为true或者false，当true的时候添加元素就可以了
"""


def filter_list(fnc, arr_list):
    res = []
    for index in arr_list:
        if fnc(index):
            res.append(index)

    return res


# 偶数排序
def fn1(index):
    if index % 2 == 0:
        return True
    else:
        return False


# 奇数筛选
def fn2(index):
    if index % 2 != 0:
        return True
    else:
        return False


# 大于5筛选
def fn3(index):
    if index > 5:
        return True
    else:
        return False


# 传入筛选条件 实现筛选->filter方法
# 注意函数后面只能写函数名，不能写括号不然就是函数调用传的是返回值
print(filter_list(fn2, arr_list))
"""
filter()方法逻辑
    前面是一个函数，后面是一个可迭代序列
"""
print(list(filter(fn3, arr_list)))

"""
java8里面的新特性-lambda表达式原理 匿名函数
    python里面lambda关键字可以构建一个简单的匿名函数，这样就能实现高阶函数的使用
    匿名函数只会定义一次，一旦使用就没了大大减少了函数定义和调用
    lambda语法：
        lambda 参数列表:返回值
        匿名函数一般作为参数使用
"""
lambda a, b: a + b
print(lambda a, b: a + b)
# lambda表达式调用 直接调用 基本不这样用
print((lambda a, b: a + b)(10, 20))

# 改造 fn3改为lambda并且调用
print(filter_list(lambda index: index > 5, arr_list))
print(list(filter(lambda index: index > 5, arr_list)))

"""
map()方法逻辑
    java8里面lambda表达式的map函数转换加上转换条件转换成map
    python中的map()方法,同样可以实现按照逻辑操作，并且转换成map输出
"""

print(list(map(lambda a: a ** 2, arr_list)))

"""
sort()方法逻辑
    默认比较元素的大小
    sort函数可以接受一个关键字参数 ，key。
    key需要一个函数作为参数，当用户传参传值key作为参数的时候。那么会循环列表，将key函数得到的返回值作为比较元素的大小
sorted()排序逻辑
    sorted()方法能对所有的序列进行排序，并且不会改变原来的元素逻辑。
"""
str_list = ['aaaaa', 'v', 'dd', 'ffasa']
str_list.sort(key=len)
print(str_list)
str_list=['2',1,3,4,'5']
print('排序前',str_list)
print('排序后',sorted(str_list,key=int))